﻿using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using TVPeruRFIDMovil.Formularios;
using TVPeruRFIDMovil.ServicioWS;
using TVPeruRFIDMovil.Clases.Negocio;
using LH.Library;
using LH.PsionRFID;
using TVPeruRFIDMovil.Clases.Movil;
using TVPeruRFIDMovil.Herramientas;

//using PsionTeklogix.Keyboard;
//using PsionTeklogix.Trigger;
//using com.caen.RFIDLibrary;
//using PsionTeklogix.RFID;

namespace TVPeruRFIDMovil
{
    public partial class frmRegistrarMovimientoIngreso : frmBase
{
    //#region Psion Trigger Members and Functions

    //private TriggerControl tc = null;
    //const string TemporaryClient = "CAEN_TRIGGER";

    //void TriggerClose()
    //{
    //    if (tc != null)
    //    {
    //        try
    //        {
    //            tc.triggerEvent += new TriggerEventHandler(OnTriggerEvent);
    //            tc.DeregisterFromEvents(TemporaryClient);
    //            tc.DeregisterConsumer(TemporaryClient);
    //        }
    //        catch
    //        {
    //        }
    //        finally
    //        {
    //            tc.Dispose();
    //            tc = null;
    //        }
    //    }
    //}

    //bool TriggerInit()
    //{
    //    // Instantiate Trigger Control
    //    try
    //    {
    //        tc = new TriggerControl();
    //    }
    //    catch
    //    {
    //        TriggerClose();
    //        return false;
    //    }

    //    // Initialize Trigger Control
    //    try
    //    {
    //        tc.Initialize();
    //    }
    //    catch
    //    {
    //        TriggerClose();
    //        return false;
    //    }

    //    ArrayList names = new ArrayList();
    //    try
    //    {
    //        tc.GetRegisteredConsumers(names);
    //    }
    //    catch
    //    {
    //        TriggerClose();
    //        return false;
    //    }

    //    Boolean ConsumerAlreadExist = false;
    //    foreach (string s in names)
    //    {
    //        if (s.Equals(TemporaryClient))
    //        {
    //            ConsumerAlreadExist = true;
    //            break;
    //        }
    //    }

    //    // Register the temporary trigger event consumer
    //    if (ConsumerAlreadExist == false)
    //    {
    //        try
    //        {
    //            tc.RegisterConsumer(TemporaryClient);
    //        }
    //        catch
    //        {
    //            TriggerClose();
    //            return false;
    //        }
    //    }

    //    try
    //    {
    //        uint flags = (TriggerControl.Flags.Override | TriggerControl.Flags.Temporary | TriggerControl.Flags.WantsTriggerEvents);

    //        tc.AddMapping(0, TemporaryClient, flags);
    //        tc.AddMapping(Keyboard.TranslateToTriggerID(Key.HandgripScan), TemporaryClient, flags);
    //        tc.AddMapping(Keyboard.TranslateToTriggerID(Key.Scan), TemporaryClient, flags);
    //        tc.AddMapping(Keyboard.TranslateToTriggerID(Key.LeftScan), TemporaryClient, flags);
    //        tc.AddMapping(Keyboard.TranslateToTriggerID(Key.RightScan), TemporaryClient, flags);
    //        tc.AddMapping(Keyboard.TranslateToTriggerID(Key.SideLeftScan), TemporaryClient, flags);
    //        tc.AddMapping(Keyboard.TranslateToTriggerID(Key.SideRightScan), TemporaryClient, flags);
    //    }
    //    catch
    //    {
    //        TriggerClose();
    //        return false;
    //    }

    //    // Register for events
    //    try
    //    {
    //        tc.RegisterForEvents(TemporaryClient);
    //    }
    //    catch
    //    {
    //        TriggerClose();
    //        return false;
    //    }

    //    // Add delegate
    //    try
    //    {
    //        tc.triggerEvent += new TriggerEventHandler(OnTriggerEvent);
    //    }
    //    catch
    //    {
    //        TriggerClose();
    //        return false;
    //    }
    //    return true;
    //}

    //private void OnTriggerEvent(object sender, TriggerEvent e)
    //{
    //    switch (e.EventFlags)
    //    {
    //        case TriggerEvent.TriggerUp:
    //            {
    //                //Cuando se presiona
    //            }
    //            break;
    //        case TriggerEvent.TriggerDown:
    //            {
    //                //Cuando se suelta
    //            }
    //            break;
    //    }
    //}

    //#endregion

    #region --- Variables y Constantes ---

    public Solicitud solicitud { get; set; }
    public Movimiento movimiento { get; set; }
    public DetalleBienSolicitud[] listaDetalleBienSolicitudObt { get; set; }
   
    //private Bien bien = null;
    private List<DetalleBienMovimiento> listaDetalleBienMovimiento = new List<DetalleBienMovimiento>();


    private const int INDICE_COLUMNA_BIEN_CODBARRA = 1;
    private const int INDICE_COLUMNA_BIEN_DESCRIPCION = 2;

    #endregion
        
    #region --- Constructor ---
        public frmRegistrarMovimientoIngreso()
        {
            InitializeComponent();
        }
        #endregion

    #region --- Eventos formulario ---
    private void frmRegistrarMovimientoIngreso_Load(object sender, EventArgs e)
    {
        cargarFormulario();
    }
    private void mnuAceptar_Click(object sender, EventArgs e)
    {
        guardar();
    }

    private void mnuSalir_Click(object sender, EventArgs e)
    {
        salir(DialogResult.Cancel);
    }
    #endregion

    #region --- Metodos Propios ---
    private void cargarFormulario()
    {
        try
        {
            Cursor.Current = Cursors.WaitCursor;
            this.WindowState = FormWindowState.Maximized;

            // Se agrega muestra el detalle de OC
            this.lvwListado.BeginUpdate();
            this.lvwListado.Items.Clear();

            ListViewItem nuevoItem = null;

            foreach (DetalleBienSolicitud detalleBienSolicitud in this.listaDetalleBienSolicitudObt)
            {
                nuevoItem = new ListViewItem(detalleBienSolicitud.etiqueta.bien.codBarra);
                nuevoItem.SubItems.Add(detalleBienSolicitud.etiqueta.bien.descripcion);
                this.lvwListado.Items.Add(nuevoItem);
            }

            this.lvwListado.EndUpdate();
        }
        catch (Exception ex)
        {
            mostrarMensajeError(ex, this.lblTitulo.Text);
        }
        finally
        {
            Cursor.Current = Cursors.Default;
        }
    }

    private void procesarLectura (LH.PsionRFID.ListaTag listaTag) // private void procesarLectura(string epc)
    {
        ListViewItem viewBienActual = null;
        int indice = 0;

     try
     {
        // Si no hay epc leidos, entonces salir
        if (listaTag.Count == 0) { return; }

        // Validar que haya buscado primero el bien
        if (this.listaDetalleBienSolicitudObt == null) { return; }

        // Desactiva el lector RFID
        quitarEventoGatillo();

        // Filtrar Listado de Tag repetidos
        listaTag = filtrarListadoTagEpc(listaTag);

        Cursor.Current = Cursors.WaitCursor;
        
        foreach (LH.PsionRFID.Tag tag in listaTag)
        {
            indice = 0;
            foreach (DetalleBienSolicitud detalleBien in this.listaDetalleBienSolicitudObt)
            {
                if (detalleBien.etiqueta.epc.Equals(tag.Epc))
                {
                    viewBienActual = this.lvwListado.Items[indice];

                    // Validar por el color si la fila, ya fue despachada
                    if (viewBienActual.BackColor == Color.Green)
                    {
                        Util.ShowMessageboxExclamacion("El el bien ya fue atendido");
                        return;
                    }

                    // Cambiar de color de la fila, para indicar si esta completo
                    viewBienActual.BackColor = Color.Green;

                    //LlenarDetalleMovimiento
                    DetalleBienMovimiento detalleBienMovimiento = new DetalleBienMovimiento();
                    detalleBienMovimiento.bien = new Bien();
                    detalleBienMovimiento.bien.idBien = detalleBien.etiqueta.bien.idBien;
                    detalleBienMovimiento.bien.codBienEstado = detalleBien.etiqueta.bien.codBienEstado;
                    detalleBienMovimiento.bien.codBienSituacion = detalleBien.etiqueta.bien.codBienSituacion;
                    detalleBienMovimiento.usuarioRegistra = new Usuario();
                    detalleBienMovimiento.usuarioRegistra.idUsuario = ParametrosAplicacion.USUARIO_ACTUAL.idUsuario;

                    this.listaDetalleBienMovimiento.Add(detalleBienMovimiento);
                    break;
                }
                //else
                //{
                //    Util.ShowMessageboxExclamacion("no se encontró bien en la lista");
                //}
                indice++;
            }
            
        }
       
     }
     catch (Exception ex)
     {
                mostrarMensajeError(ex, this.lblTitulo.Text);
     }
     finally
     {
                // Activa el lector RFID
                agregarEventoGatillo();

                Cursor.Current = Cursors.Default;
     }
  }

    private LH.PsionRFID.ListaTag filtrarListadoTagEpc(LH.PsionRFID.ListaTag listaTag)
    {
        LH.PsionRFID.ListaTag listaTagResultado = new LH.PsionRFID.ListaTag();

        foreach (LH.PsionRFID.Tag tag in listaTag)
        {
            // Validar que sea una etiqueta con la cabecera de servir
            if (MetodosAplicacion.esEtiquetaValida(tag.Epc))
            {
                if (!esRepetido(listaTagResultado, tag.Epc))
                {
                    listaTagResultado.Add(tag);
                }
            }
        }

        return listaTagResultado;
    }

    private bool esRepetido(LH.PsionRFID.ListaTag listaTag, string epc)
    {
      bool resultado = false;

      foreach (LH.PsionRFID.Tag tag in listaTag)
      {
        if (tag.Epc.Equals(epc))
        {
           resultado = true;
           break;
        }
      }

      return resultado;
    }

    private bool validarEntrada()
    {
        bool resultado = false;

        if ((this.listaDetalleBienMovimiento == null) || (this.listaDetalleBienMovimiento.Count < 1))
        {
            Util.ShowMessageboxInfo("Debe recibir por lo menos un bien para guardar", this.Text);
            return true;
        }
        return resultado;
    }

    private void guardar()
    {
        Movimiento movimientoEnviar = null;
        int resultadoMovimiento = 0;

        try
        {
            if (validarEntrada()) { return; }

            if (!Util.ShowMessageboxPregunta("Esta seguro de realizar la salida")) { return; }

            Cursor.Current = Cursors.WaitCursor;

            if(this.movimiento.codMovimiento.Equals(0))
            {
                //Registrar Movimiento 
                movimientoEnviar = new Movimiento();
                movimientoEnviar.idMovimientTipo = Constantes.TIPO_MOVIMIENTO_INGRESO;
                movimientoEnviar.usuarioRegistra = new Usuario();
                movimientoEnviar.usuarioRegistra.idUsuario = ParametrosAplicacion.USUARIO_ACTUAL.idUsuario;
                movimientoEnviar.solicitud = new Solicitud();
                movimientoEnviar.solicitud.codSolicitud = this.solicitud.codSolicitud;

                using (Interfase interfase = new Interfase())
                {
                    resultadoMovimiento = interfase.registrarMovimiento(this.listaDetalleBienMovimiento, movimientoEnviar);
                }

            }
            else
            {
                //Registrar Movimiento 
                movimientoEnviar = new Movimiento();
                movimientoEnviar.codMovimiento = this.movimiento.codMovimiento;
                movimientoEnviar.usuarioEdita = new Usuario();
                movimientoEnviar.usuarioEdita.idUsuario = ParametrosAplicacion.USUARIO_ACTUAL.idUsuario;

                using (Interfase interfase = new Interfase())
                {
                    resultadoMovimiento = interfase.actualizarMovimiento(this.listaDetalleBienMovimiento, movimientoEnviar);
                }

            }
           
            if (resultadoMovimiento > 0 )
            {
                Util.ShowMessageboxInfo("Se registró movimiento ingreso correctamente");
                salir(DialogResult.OK);              
            }       
            else
            {
                Util.ShowMessageboxExclamacion("No se registró movimiento salida");
            }

        }
        catch (Exception ex)
        {
            mostrarMensajeError(ex, this.lblTitulo.Text);
        }
        finally
        {
            Cursor.Current = Cursors.Default;
        }
    }
    private void salir(DialogResult resultado)
    {
        this.DialogResult = resultado;
    }
    #endregion

    #region --- Eventos LectorRFID ---
    protected override void OnInicioCapturaData()
    {

    }

    protected override void OnCapturaData(LH.PsionRFID.Tag tag)
    {
        // Validar que sea una etiqueta con la cabecera de servir


    }

    protected override void OnFinCapturaData(LH.PsionRFID.ListaTag listaTag)
    {
        procesarLectura(listaTag);

        //foreach (LH.PsionRFID.Tag tag in listaTag)
        //{
        //    if (MetodosAplicacion.esEtiquetaValida(tag.Epc))
        //    {
        //        procesarLectura(tag.Epc);
        //        //break;
        //    }
        //}

    }

    #endregion

}
}